home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 January - Disc 2 / Macworld (1999-01) (Disk 2).dmg / Serious Demos / Symbolic Composer 4.2 / Environment / System / DEF / Convert / Metrics / change-length < prev    next >
Lisp/Scheme  |  1998-10-23  |  2KB  |  65 lines

  1. change-length operator value length-values &optional type
  2.  
  3. Returns a list of length values calculated using operator and value. The value and length values can be both tick values, length symbols or ratios. Depending on the type the output is a list of ratios, which in compilation are length corrected, or tick values, which are not corrected. The type is optional and if not supplied it defaults to :tick.
  4.  
  5. Operators
  6.  
  7. :add    -   adds value to length-values
  8. :sub    -   subtracts value from length-values
  9. :times  -   multiplies length-values by value
  10. :divide -   divides length-values by value 
  11.  
  12. Notice that the values returned are by default tick values. By default 1920 ticks per whole note are used. This can be changed (if ever needed?) by set-whole-note.
  13.  
  14. (change-length :add 0 '(1/4 1/4. -1/4.. 1/4...))
  15. --> (480 720 -840 900)
  16.  
  17. (change-length :add 0 '(1/4 1/4. -1/4.. 1/4...) :ratio)
  18. --> (1/4 3/8 -7/16 15/32)
  19.  
  20. Adding Tick Values
  21.  
  22. Tick-values can be added only to when the output is a tick list.
  23.  
  24. (change-length :add 1 '(1/4 1/4. -1/4.. 1/4...))
  25. --> (481 721 -841 901)
  26.  
  27. Adding Lengths
  28.  
  29. Adding integer to :ratio output yields into adding a '1/1 note.
  30.  
  31. (change-length :add 1 '(1/4 1/4. -1/4.. 1/4...) :ratio)
  32. --> (5/4 11/8 -23/16 47/32)
  33.  
  34. (change-length :add '1/1 '(1/4 1/4. -1/4.. 1/4...) :ratio)
  35. --> (5/4 11/8 -23/16 47/32)
  36.  
  37. (change-length :add '1/1. '(1/4 1/4. -1/4.. 1/4...) :ratio)
  38. --> (7/4 15/8 -31/16 63/32)
  39.  
  40. Other operations
  41.  
  42. (change-length :times 2 '(1/4 1/4. -1/4.. 1/4...) :ratio)
  43. --> (1/2 3/4 -7/8 15/16)
  44.  
  45. (change-length :times '1/4. '(1/4 1/4. -1/4.. 1/4...) :ratio)
  46. --> (3/32 9/64 -21/128 45/256)
  47.  
  48. (change-length :divide 2 '(1/4 1/4. -1/4.. 1/4...))
  49. --> (240 360 -420 450)
  50.  
  51. (change-length :divide 2 '(1/4 1/4. -1/4.. 1/4...) :ratio)
  52. --> (1/8 3/16 -7/32 15/64)
  53.  
  54. To change lengths in multiple lists use mapcar.
  55.  
  56. (setq pat '(1/4 1/4. -1/4.. 1/4...))
  57.  
  58. (mapcar #'(lambda (x) (change-length :times 2 x :ratio))
  59.         (list pat (reverse pat)))
  60. --> ((1/2 3/4 -7/8 15/16) (15/16 -7/8 3/4 1/2))
  61.  
  62. (mapcar #'(lambda (x) (change-length :times 10 x))
  63.         '((1 2 3) (4 5 6)))
  64. --> ((10 20 30) (40 50 60))
  65.